热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都会|开支_MySQL主从复制及读写分离实际部署与验证

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL主从复制及读写分离实际部署与验证相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL主从复制及读写分离实际部署与验证相关的知识,希望对你有一定的参考价值。



mysql主从复制及读写分离


    • 前言:

  • 一、主从复制
    • 1.原理:
    • 2.准备来做主从复制和读写分离的服务器如下:
    • 3.主从复制具体步骤
      • 1.关闭所有服务器的防火墙
      • 2.Mysql主从服务器都进行时间同步
      • 3.主从服务器mysql配置
      • 4.从服务器的mysql配置
      • 5.Mysql主从复制的效果


  • 二、读写分离
    • 1.原理:
    • 2.读写分离的方案
      • 2.1基于程序代码内部实现
      • 2.2 基于中间代理层实现

    • 3.读写分离的拓扑图
    • 4.操作思路
    • 5.具体搭建mysql读写分离操作:
      • amoeba服务器
      • 1 安装java jdk1.6环境
      • 2 安装amoeba软件
      • 3 在主从服务器上的mysql分别授权
      • 4 配置 Amoeba读写分离,两个 Slave 读负载均衡
      • 5 修改amoeba配置文件
      • 6 修改数据库配置文件
      • 7 客户端操作
      • 8 在客户端上创建登录代理服务器amoeba访问mysql
      • 9读写分离测试:


  • 三、总结:
    • 1.主从复制里三个线程两个日志
    • 2.读写分离
      • 优点




前言:

在现网生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,一般来说 都是通过主从复制(Master-Slave)来同步数据,再通过读写分离来提升数据库并发负载能力的方案来进行部署与实施


一、主从复制

1.原理:


主MySQL服务器做的修改,都会通过dump线程写入自己的二进制日志(Binary log) ,然后 ,从MySQL服务器通过自己的I/O线程 连接主服务器,进行读取主服务器的二进制日志,备份写入到从服务器的中继日志(Relay log) 当中,然后从服务器通过SQL线程 ,将中继日志中的数据重放到自己的服务器中,复制完成。
a

这里有三个进程两个日志需要着重理解


  • dump线程:master服务器上,记录所有更改的线程。
  • I/O线程:从服务器上用来读取、备份到从服务器上的中继日志的进程。
  • SQL线程:从服务中读取中继日志写入自身变化的进程。
  • 二进制文件:主服务器上记录更新的日志
  • 中继日志文件:由主服务器上下载下来放在从服务器上记录的。

2.准备来做主从复制和读写分离的服务器如下:


服务器IP地址所需的软件
Master192.168.40.50ntp 、 mysql-boost-5.7.20.tar.gz
slave 1192.168.40.60ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz
slave 2192.168.40.61ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz
amoeba192.168.40.80jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz
client192.168.40.88mysql-boost-5.7.20.tar.gz

3.主从复制具体步骤


1.关闭所有服务器的防火墙


2.Mysql主从服务器都进行时间同步

在末行添加


开启服务

从服务器设置时间同步(192.168.40.60 和192.168.40.61)

yum -y install ntp ntpdate
service ntpd start
/usr/sbin/ntpdate 192.168.40.50 #进行时间同步,指向Master服务器IP
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.184.50




3.主从服务器mysql配置

vim /etc/my.cnf
server-id = 1
log-bin=master-bin #添加,主服务器开启二进制日志
log-slave-updates=true #添加,允许从服务器更新二进制日志
systemctl restart mysqld
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'one'@'192.168.40.%' IDENTIFIED BY '123123'; #给从服务器授权
FLUSH PRIVILEGES;
show master status\\G;
#File 列显示日志名,Fosition 列显示偏移量




4.从服务器的mysql配置

vim /etc/my.cnf
server-id = 2 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #添加,定义中继日志文件的位置和名称
systemctl restart mysqld
mysql -u root -p
change master to master_host='192.168.40.50' , master_user='one',master_password='123123',master_log_file='master-bin.000001',master_log_pos=843;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,这里的是例子,每个人的都不一样
start slave; #启动同步,如有报错执行 reset slave;
show slave status\\G #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程




5.Mysql主从复制的效果

我们可以看到在开启主从复制的时候,从服务器上能够查询到主服务器的数据库信息。

我们把slave1的主从关掉后,再去master服务器上进行数据库信息的增加。

再去slave1 上查看数据库内容,发现数据不同步。


我们再次打开从服务器的start slave,可以发现从服务器上的数据又从主服务器上同步过来了。


二、读写分离

1.原理:

读写分离基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
简单的来说三点:


  • 只在主服务器上写,只在从服务器上读。
  • 主数据库处理事务性查询,而从数据库处理 select 查询。
  • 数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。

2.读写分离的方案


2.1基于程序代码内部实现

在代码中根据select. insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支:缺点是需要开发人员来实现,运维人员无从下手。


2.2 基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库,有两个代表性程序。
(1) MySQL-Proxy。MySQL- -Proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL官方并不建议将MySQL- -Proxy 用到生产环境。
(2) Amoeba (变形虫)。由陈思儒开发,其曾就职于阿里巴巴。该程序用Java语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。
经过上述简单的比较,通过程序代码实现MySQL读写分离自然是一个不错的选择, 但是并不是所有的应用都适合在程序代码中实现读写分离,例如一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种大型复杂的应用一般会考虑使用代理层来实现。


  • Amoeba是一个非常容易使用,可移植性非常强的软件,因此它在生产环境中被广泛用于数据库的代理层。

3.读写分离的拓扑图


4.操作思路


5.具体搭建mysql读写分离操作:


amoeba服务器

amoeba (192.168.40.80)


1 安装java jdk1.6环境

因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
将jdk-6u14-linux-x64.bin 和 amoeba-mysql-binary-2.2.0.tar.gz.0 上传到/opt目录下。


切换至cd /usr/local目录下
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
按空格到最后一行
按yes,按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version




2 安装amoeba软件



3 在主从服务器上的mysql分别授权


这里是第二个账户我们用two表示,是amoeba登录主从的账户权限
grant all on *.* to 'two'@'192.168.40.%' identified by '123123';




4 配置 Amoeba读写分离,两个 Slave 读负载均衡

amoeba服务器:192.168.40.80


5 修改amoeba配置文件




6 修改数据库配置文件


cp dbServers.xml dbServers.xml.bak
vim dbServers.xml
#---------23注释掉--------------------------------------
作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- mysql schema
<property name&#61;"schema">test</property>
-->
#---------26修改-----------------------------------------
<!-- mysql user -->
<property name&#61;"user">two</property>
#---------28-30去掉注释----------------------------------
<property name&#61;"password">123123</property>
#---------45修改&#xff0c;设置主服务器的名Master------------------
<dbServer name&#61;"master" parent&#61;"abstractServer">
#---------48修改&#xff0c;设置主服务器的地址----------------------
<property name&#61;"ipAddress">192.168.40.50</property>
#---------52修改&#xff0c;设置从服务器的名slave1-----------------
<dbServer name&#61;"slave1" parent&#61;"abstractServer">
#---------55修改&#xff0c;设置从服务器1的地址---------------------
<property name&#61;"ipAddress">192.168.40.60</property>
#---------58复制上面6行粘贴&#xff0c;设置从服务器2的名slave2和地址---
<dbServer name&#61;"slave2" parent&#61;"abstractServer">
<property name&#61;"ipAddress">192.168.40.61</property>
#---------修改后的65或66修改-------------------------------------
<dbServer name&#61;"slaves" virtual&#61;"true">
#---------71修改----------------------------------------
<property name&#61;"poolNames">slave1,slave2</property>
/usr/local/amoeba/bin/amoeba start& #启动Amoeba软件&#xff0c;按ctrl&#43;c 返回
netstat -anpt | grep java #查看8066端口是否开启&#xff0c;默认端口为TCP 8066







7 客户端操作

client&#xff1a; 192.168.40.88

使用yum快速安装MySQL虚拟客户端


8 在客户端上创建登录代理服务器amoeba访问mysql

yum install -y mysql mysql-server
mysql -u three -p123123 -h 192.168.40.80 -P8066


9读写分离测试&#xff1a;

测试思路&#xff1a;


  • 已知读写分离是通过slave服务器去读&#xff1b;修改&#xff0c;变更通过master服务器写入。
  • 因此我们断开主从&#xff0c;直接在master写入数据&#xff0c;再通过客户端直接读取数据库&#xff0c;看是否读取到变更。
  • 读不到则说明读取数据库不是直接从master&#xff0c;再在从服务器上写入数据&#xff0c;再在客户端查询是否变更&#xff0c;如果变更&#xff0c;则说明&#xff0c;客户端通过amoeba代理读取数据库是从slave上读取的&#xff0c;和master无关。





在slave1上插入数据

insert into aa values(11,&#39;slave1&#39;);


在slave2上插入数据

insert into aa values(22,&#39;slave2&#39;);

在master上插入数据

insert into aa values(33,&#39;master33&#39;);


再在客户端写入

insert into aa values(44,&#39;cilent&#39;);

我们通过在client上直接查询数据库可以看到&#xff0c;我在本地写入的44数据查不到&#xff0c;只能轮询查到slave上的数据。


  • 打开master进行查询&#xff0c;可以看到可以看到 client 上写入的数据&#xff0c;这里即可以说明 写入写到master里&#xff0c;读取是从slave上轮询读取。






    主从复制&#43;读写分离成功

三、总结&#xff1a;

1.主从复制里三个线程两个日志


  • dump线程&#xff1a;master服务器上&#xff0c;记录所有更改的线程。
  • I/O线程&#xff1a;从服务器上用来读取、备份到从服务器上的中继日志的进程。
  • SQL线程&#xff1a;从服务中读取中继日志写入自身变化的进程。
  • 二进制文件&#xff1a;主服务器上记录更新的日志
  • 中继日志文件&#xff1a;由主服务器上下载下来放在从服务器上记录的。


2.读写分离

slave服务器提供读取功能
master服务器提供写入功能


优点

提高用户体验


推荐阅读
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • Linux下MySQL 8.0.28安装指南
    本文详细介绍了在Linux系统上安装MySQL 8.0.28的步骤,包括下载数据库、解压数据包、安装必要组件和启动MySQL服务。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 通过使用Sqoop导入工具,可以精确控制并高效地将表数据的特定子集导入到HDFS中。具体而言,可以通过在导入命令中添加WHERE子句来指定所需的数据范围,从而在数据库服务器上执行相应的SQL查询,并将查询结果高效地存储到HDFS中。这种方法不仅提高了数据导入的灵活性,还确保了数据的准确性和完整性。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
author-avatar
马先生2502911467
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有